/*
 * @Author       : tfhappy
 * @Date         : 2020-07-07 00:52:54
 * @LastEditTime : 2020-07-10 00:48:56
 * @FilePath     : /giteecli/api/repositories.go
 * @Description  :
 */
package api

import (
	"time"

	"gitee.com/tfhappy/giteecli/common"
)

type CreateRepositoryRequest struct {
	Name              string `json:"name"`               // 仓库名称
	AccessToken       string `json:"access_token"`       // 用户授权码
	Description       string `json:"description"`        // 仓库描述
	Homepage          string `json:"homepage"`           // 主页(eg: https://gitee.com)
	HasIssues         bool   `json:"has_issues"`         // 允许提Issue与否。默认: 允许(true)
	HasWiki           bool   `json:"has_wiki"`           // 提供Wiki与否。默认: 提供(true)
	CanComment        bool   `json:"can_comment"`        // 允许用户对仓库进行评论。默认： 允许(true)
	AutoInit          bool   `json:"auto_init"`          // 值为true时则会用README初始化仓库。默认: 不初始化(false)
	GitignoreTemplate string `json:"gitignore_template"` // Git Ingore模版
	LicenseTemplate   string `json:"license_template"`   // License模版
	Private           bool   `json:"private"`            //仓库公开或私有。默认: 公开(false)
}

type CreateRepositoryResp struct {
	common.CommonError
	ID        int    `json:"id"`
	FullName  string `json:"full_name"`
	HumanName string `json:"human_name"`
	URL       string `json:"url"`
	Namespace struct {
		ID      int    `json:"id"`
		Type    string `json:"type"`
		Name    string `json:"name"`
		Path    string `json:"path"`
		HTMLURL string `json:"html_url"`
	} `json:"namespace"`
	Path  string `json:"path"`
	Name  string `json:"name"`
	Owner struct {
		ID                int    `json:"id"`
		Login             string `json:"login"`
		Name              string `json:"name"`
		AvatarURL         string `json:"avatar_url"`
		URL               string `json:"url"`
		HTMLURL           string `json:"html_url"`
		FollowersURL      string `json:"followers_url"`
		FollowingURL      string `json:"following_url"`
		GistsURL          string `json:"gists_url"`
		StarredURL        string `json:"starred_url"`
		SubscriptionsURL  string `json:"subscriptions_url"`
		OrganizationsURL  string `json:"organizations_url"`
		ReposURL          string `json:"repos_url"`
		EventsURL         string `json:"events_url"`
		ReceivedEventsURL string `json:"received_events_url"`
		Type              string `json:"type"`
		SiteAdmin         bool   `json:"site_admin"`
	} `json:"owner"`
	Description         string      `json:"description"`
	Private             bool        `json:"private"`
	Public              bool        `json:"public"`
	Internal            bool        `json:"internal"`
	Fork                bool        `json:"fork"`
	HTMLURL             string      `json:"html_url"`
	SSHURL              string      `json:"ssh_url"`
	ForksURL            string      `json:"forks_url"`
	KeysURL             string      `json:"keys_url"`
	CollaboratorsURL    string      `json:"collaborators_url"`
	HooksURL            string      `json:"hooks_url"`
	BranchesURL         string      `json:"branches_url"`
	TagsURL             string      `json:"tags_url"`
	BlobsURL            string      `json:"blobs_url"`
	StargazersURL       string      `json:"stargazers_url"`
	ContributorsURL     string      `json:"contributors_url"`
	CommitsURL          string      `json:"commits_url"`
	CommentsURL         string      `json:"comments_url"`
	IssueCommentURL     string      `json:"issue_comment_url"`
	IssuesURL           string      `json:"issues_url"`
	PullsURL            string      `json:"pulls_url"`
	MilestonesURL       string      `json:"milestones_url"`
	NotificationsURL    string      `json:"notifications_url"`
	LabelsURL           string      `json:"labels_url"`
	ReleasesURL         string      `json:"releases_url"`
	Recommend           bool        `json:"recommend"`
	Homepage            string      `json:"homepage"`
	Language            interface{} `json:"language"`
	ForksCount          int         `json:"forks_count"`
	StargazersCount     int         `json:"stargazers_count"`
	WatchersCount       int         `json:"watchers_count"`
	DefaultBranch       string      `json:"default_branch"`
	OpenIssuesCount     int         `json:"open_issues_count"`
	HasIssues           bool        `json:"has_issues"`
	HasWiki             bool        `json:"has_wiki"`
	IssueComment        interface{} `json:"issue_comment"`
	CanComment          bool        `json:"can_comment"`
	PullRequestsEnabled bool        `json:"pull_requests_enabled"`
	HasPage             bool        `json:"has_page"`
	License             interface{} `json:"license"`
	Outsourced          bool        `json:"outsourced"`
	ProjectCreator      string      `json:"project_creator"`
	Members             []string    `json:"members"`
	PushedAt            interface{} `json:"pushed_at"`
	CreatedAt           time.Time   `json:"created_at"`
	UpdatedAt           time.Time   `json:"updated_at"`
	Parent              interface{} `json:"parent"`
	Paas                interface{} `json:"paas"`
	Stared              bool        `json:"stared"`
	Watched             bool        `json:"watched"`
	Permission          struct {
		Pull  bool `json:"pull"`
		Push  bool `json:"push"`
		Admin bool `json:"admin"`
	} `json:"permission"`
	Relation string `json:"relation"`
}

func CreateRepository(r *CreateRepositoryRequest) (*CreateRepositoryResp, error) {
	resp, err := common.JsonPost(common.GiteeCreateRepoURL, r)
	if err != nil {
		return nil, err
	}
	defer resp.Body.Close()

	res := &CreateRepositoryResp{}
	err = common.ParseJsonBody(resp.Body, res)
	if err != nil {
		return nil, err
	}
	if !res.CommonError.IsNil() {
		return nil, res.CommonError
	}
	return res, nil
}
